import Dep from './Dep';
import observe from './observe';

export default function defineReactive(data, key, val) {
  const dep = new Dep();

  if (arguments.length == 2) {
    val = data[key];
  }
  // 子元素进行observe，至此形成递归
  let childOb = observe(val);

  Object.defineProperty(data, key, {
    // 可枚举
    enumerable: true,
    // 可配置，比如delete
    configurable: true,
    get() {
      console.log('试图访问', key);
      // 如果现在处于依赖收集阶段
      if (Dep.target) {
        dep.depend();
        if (childOb) {
          childOb.dep.depend();
        }
      }
      return val;
    },
    set(newValue) {
      if (val === newValue) return;
      console.log('试图修改', key);
      val = newValue;
      // 当设置了新值后也要observe
      childOb = observe(newValue);

      // 发布订阅模式， 通知dep
      dep.notify();
    }
  })
}